package controlador;

import java.io.*;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import jcifs.smb.NtlmPasswordAuthentication;
import jcifs.smb.SmbFile;
import jcifs.smb.SmbFileOutputStream;
import modelo.bd.excepcion.DAOException;
import modelo.dominio.*;
import modelo.servicio.Areas;
import modelo.servicio.Documentos;
import modelo.servicio.Secciones;
import org.apache.tomcat.util.http.fileupload.FileItem;
import org.apache.tomcat.util.http.fileupload.FileUploadException;
import org.apache.tomcat.util.http.fileupload.disk.DiskFileItemFactory;
import org.apache.tomcat.util.http.fileupload.servlet.ServletFileUpload;

public class DocumentoControlador extends HttpServlet {

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=ISO-8859-1");
        String accion   = request.getParameter("ac") == null ? "" : request.getParameter("ac");
        PrintWriter out = null;
        if (!accion.equals("dl")) {
            out = response.getWriter();
        }
        if (request.getSession().getAttribute("sUsuario") == null) {
            request.getSession().invalidate();
            response.sendRedirect(getServletContext().getContextPath() + "/index.jsp");
        }
        try {
            String idBanco;
            idBanco = request.getParameter("id") == null ? "" : request.getParameter("id");

            if (accion.equals("ls")) {
                int pagActual, pagUltim, desde, hasta, total;
                pagActual = request.getParameter("co") == null ? 1 : Integer.parseInt(request.getParameter("co"));
                hasta     = pagActual * SeccionControlador.getPaginado();
                desde     = hasta - SeccionControlador.getPaginado() + 1;
                pagUltim  = Documentos.instancia().obtenerTotal(Integer.parseInt(idBanco));
                String sigOk = pagUltim > hasta ? "" : "disabled='disabled'";
                total     = (int) Math.ceil((double) pagUltim / (double) SeccionControlador.getPaginado());
                //List<Documento> docs = Documentos.instancia().obtenerPorSeccion(Integer.parseInt(idBanco));
                List<Documento> docs = Documentos.instancia().obtenerPorRango(desde, hasta, Integer.parseInt(idBanco));
                if (docs != null && !docs.isEmpty()) {
                    request.setAttribute("documentos", docs);
                    request.setAttribute("sigOK", sigOk);
                    request.setAttribute("total", total);
                    getServletContext().getRequestDispatcher("/jsp/documento/listado.jsp").forward(request, response);
                } else {
                    if (request.getSession().getAttribute("sPerfil").toString().equalsIgnoreCase("A")) {
                        out.println("<br/><div id='controles'>"
                                + "<a href='javascript:void(0)' onclick=\"charge('#centro', 'front?v=2&ac=0&id=" + idBanco + "');\">"
                                + "<img src='images/agregar.png' width='25' height='25' alt='agregar' title='Agregar Documento'/>"
                                + "</a>"
                                + "</div>");
                    }
                    out.println("Esta Secci&oacute;n no contiene documentos");
                }
            } else if (accion.equals("dl")) {
                try {
                    String arcc = request.getParameter("src");
                    response.setContentType("APPLICATION/OCTET-STREAM");
                    int desde            = arcc.lastIndexOf("\\") > 0 ? arcc.lastIndexOf("\\") : arcc.length();
                    String nombreArchivo = arcc.substring(desde + 1, arcc.length());
                    response.setHeader("Content-Disposition", "Attachment;Filename=\"" + nombreArchivo + "\"");
                    ServletOutputStream outF = response.getOutputStream();
                    //------------SIN SMB
//                    File fichero = new File(arcc);
//                    FileInputStream in = new FileInputStream(fichero);
                    //------------CON SMB
                    NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication(SeccionControlador.getUsuarioCIFS());
                    String path    = "smb:" + arcc.replace("\\", "/");
                    SmbFile sFile  = new SmbFile(path, auth);
                    InputStream in = sFile.getInputStream();
                    //------------Sending File
                    byte[] buffer = new byte[SeccionControlador.getTamanioBuffer()];
                    int read;
                    while ((read = in.read(buffer, 0, SeccionControlador.getTamanioBuffer())) != -1) {
                        outF.write(buffer, 0, read);
                    }
                    outF.close();
                    in.close();
                    //------------------------ 
                } catch (Exception e) {
                    out.print(e.getMessage());
                }
            } else if (accion.equals("bo")) {
                String claveDoc = request.getParameter("clv");
                Documentos.instancia().eliminar(claveDoc);
                out.println("Se inactiv&oacute; el documento con clave: " + claveDoc + "<br/>");
            } else if (accion.equals("va")) {
                String url = request.getRequestURL().toString();
                url = request.getQueryString();
                if (request.getParameter("fo") != null && request.getParameter("id") != null && request.getParameter("fd") != null) {
                    Seccion secc = Secciones.instancia().obtenerPorId(Integer.parseInt(request.getParameter("id")));
                    String clv = secc.getArea().getPlanta().getAbreviacion();
                    clv += "-" + secc.getArea().getAbreviacion();
                    clv += "-" + secc.getAbreviacion();
                    clv += "-AUTO";
                    clv += "-" + request.getParameter("fo");
                    clv += "-" + request.getParameter("fd").toString().replace("/", "");
                    if (Documentos.instancia().existe(clv)) {
                        out.println("<input type=\"hidden\" name=\"existe\" value=\"1\">");
                    } else {
                        out.println("<input type=\"hidden\" name=\"existe\" value=\"0\">");
                    }
                } else {
                    out.println("<input type=\"hidden\" name=\"existe\" value=\"1\">");
                }
            }
            boolean isMultipart = ServletFileUpload.isMultipartContent(request);
            String carpeta = "";
            if (isMultipart) {
                try {
                    String nombreArchivo;
                    List<FileItem> items = null;
                    DiskFileItemFactory factory = new DiskFileItemFactory();
                    factory.setSizeThreshold(SeccionControlador.getTamanioBuffer());
                    factory.setRepository(new File(SeccionControlador.getDirectorioTemporal()));
                    ServletFileUpload upload = new ServletFileUpload(factory);
                    try {
                        items = upload.parseRequest(request);
                    } catch (FileUploadException ex) {
                        out.println("Error de Parsing: " + ex.getMessage());
                    }
                    Documento docu = new Documento();
                    String valor = "";
                    for (int i = 0; i < items.size(); i++) {
                        FileItem item = (FileItem) items.get(i);
                        if (item.isFormField()) {
                            //out.println(item.getFieldName() + ": " + item.getString());
                            if (item.getFieldName().equals("clave")) {
                                nombreArchivo = item.getString();
                                docu.setClave(nombreArchivo);
                            } else if (item.getFieldName().equals("folio")) {
                                docu.setFolio(item.getString());
                            } else if (item.getFieldName().equals("descripcion")) {
                                docu.setDescripcion(item.getString());
                            } else if (item.getFieldName().equals("tipo_doc")) {
                                docu.setTipoDoc(item.getString());
                            } else if (item.getFieldName().equals("carpeta_fisica")) {
                                docu.setLugarFisico(item.getString());
                            } else if (item.getFieldName().equals("f_date")) {
                                valor = item.getString();
                            } else if (item.getFieldName().equals("id")) {
                                carpeta = item.getString();
                                docu.setSeccion(Secciones.instancia().obtenerPorId(Integer.parseInt(carpeta)));
                                //docu.setRuta(item.getString()); 
                            } else if (item.getFieldName().equals("precedente")) {
                                if (!item.getString().equalsIgnoreCase("NA")) {
                                    docu.setPrecedente(Documentos.instancia().obtenerPorId(item.getString()));
                                }
                            }
                        } else {
                            Area area      = Areas.instancia().obtenerPorId(Integer.parseInt(request.getSession().getAttribute("sArea").toString()));
                            nombreArchivo  = area.getPlanta().getAbreviacion();
                            nombreArchivo += "-" + area.getAbreviacion();
                            nombreArchivo += "-" + (docu.getSeccion().getAbreviacion().equals("") ? docu.getSeccion().getIdSeccion() : docu.getSeccion().getAbreviacion());
                            nombreArchivo += "-" + docu.getTipoDoc();
                            if (!docu.getTipoDoc().equals("AUTO")) {
                                docu.setFolio(Documentos.instancia().obtenerProxFolio(docu.getTipoDoc(), area.getIdArea()));
                            }
                            nombreArchivo += "-" + docu.getFolio();
                            nombreArchivo += "-";
                            String ffecha  = valor.replace("/", "");
                            nombreArchivo += ffecha;
                            docu.setClave(nombreArchivo);
                            String fileName = item.getName();
                            int desde   = fileName.lastIndexOf(".") > 0 ? fileName.lastIndexOf(".") : fileName.length();
                            String ext  = fileName.substring(desde, fileName.length());
                            String arcc = SeccionControlador.getDirectorioCarga() + carpeta + "\\" + nombreArchivo + ext;
                            docu.setRuta(arcc); //docu.setClave(nombreArchivo); 

                            //------------- sin SMB
//                            File ruta = new File(direccionCarga + carpeta);
//                            if(!ruta.exists())
//                                ruta.mkdir();
//                            File fichero = new File(arcc);
//                            item.write(fichero);
                            //------------- Con SBM
                            NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication(SeccionControlador.getUsuarioCIFS());
                            String path  = "smb:" + arcc.replace("\\", "/");
                            SmbFile ruta = new SmbFile(("smb:" + SeccionControlador.getDirectorioCarga() + carpeta).replace("\\", "/"), auth);
                            if (!ruta.exists()) {
                                ruta.mkdir();
                            }
                            SmbFile sFile            = new SmbFile(path, auth);
                            SmbFileOutputStream sfos = new SmbFileOutputStream(sFile);

                            InputStream in = item.getInputStream();
                            byte[] buffer  = new byte[SeccionControlador.getTamanioBuffer()];
                            int read;
                            while ((read = in.read(buffer, 0, SeccionControlador.getTamanioBuffer())) != -1) {
                                sfos.write(buffer, 0, read);
                            }
                            sfos.close();
                            in.close();
                            //sfos.write(item.get());
                            //-------------
                        }
                    }//del for

                    docu.setHistorico(new Historico(request.getSession().getAttribute("sUsuario").toString()));

                    Documentos.instancia().agregar(docu);
                    if (docu.getTipoDoc().equalsIgnoreCase("AUTO")) {
                        request.setAttribute("clv", docu.getClave());
                        request.setAttribute("ac", "nw");
                        getServletContext().getRequestDispatcher("/condi").forward(request, response);

//                        String redir = "<script type=\"text/javascript\"> "
//                                + " $(document).ready(function() { "
//                                + " charge('#centro', 'condi?ac=ls&clv=" + request.getAttribute("clv") + "'); "
//                                + "}); "
//                                + "</script>";
//                        out.println(redir);
                    } else {
                        response.sendRedirect(getServletContext().getContextPath());
                    }
                } catch (Exception ex) {
                    out.println("Error del servidor: " + ex.getMessage() + " || " +ex.toString());
                }
            } else {
                //out.println("no es multipart");
            }
        } catch (DAOException ex) {
            out.println("Error de Base de datos: " + ex.getMessage());
        } catch (Exception ex) {
            out.println("Error: " + ex.getMessage());
        } finally {
            out.close();
        }
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }
    
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }
}
